﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AcademiaInteligenteWeb
{
    public partial class NewCliente_Pagamento : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            int idCliente_Pagamento;
            if (!IsPostBack)
            {
                if (int.TryParse(Request["id"], out idCliente_Pagamento))
                {
                    // WsAcademiaInteligente.Cliente_Pagamento Cliente_Pagamento = new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().SelecionarCliente_Pagamento(idCliente_Pagamento);
                    // Cliente_Pagamento.valor = Convert.ToDouble(txtCliente_Pagamento.Text);

                    // txtCliente_Pagamento.Text = Cliente_Pagamento.data_vencimento.ToString("dd/MM/yyyy");
                    //txtCliente_Pagamento.Text = Cliente_Pagamento.data_pagamento.ToString("dd/MM/yyyy");
                    lbAviso.Text = "";
                }
                carregaDdlCliente();
            }

            txt_academia.Enabled = false;

            //o campo vencimento será preenchido automaticamente ao selecionar o cliente
            txtdata_vencimento.Enabled = false;
            txt_saldoAPagarComDesconto.Enabled = false;
            txtValorComDesconto.Enabled = false;

            //o campo data de pagamento será sempre a data atual para que o sistema não se perca no momento de calcular o próximo vencimento
            // txtdata_pagamento.Enabled = false;
            //txtdata_pagamento.Text = DateTime.Today.ToString("dd/MM/yyyy");
        }

        protected void carregaDdlCliente()
        {
            ddlCliente.DataSource = new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().SelecionarClientePorAcademia(Convert.ToInt32(Session[Util.SESSION_ACADEMIA_ID]));
            ddlCliente.DataValueField = "id";
            ddlCliente.DataTextField = "nome";
            ddlCliente.DataBind();
        }


        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            WsAcademiaInteligente.Cliente_Pagamento Cliente_Pagamento = new WsAcademiaInteligente.Cliente_Pagamento();

            //tratamento para não permitir pagar um valor menor que a mensalidade
            Double saldoAPagar = Convert.ToDouble(txt_saldoAPagar.Text);
            Double valorPago = Convert.ToDouble(txtValorPago.Text);
            Double valorPagoComDesconto = Convert.ToDouble(txtValorComDesconto.Text);
            if (valorPago >= saldoAPagar)
            {
                valorPago = saldoAPagar;

                Cliente_Pagamento.valor = valorPagoComDesconto;
                //a data do vencimento será o mesmo dia que o cliente se cadastrou a cada mes
                //ex: Cliente A se cadastrou em 01/01/2001, logo seus vencimentos serão 01/02/2001, 01/03/2001 e etc...
                Cliente_Pagamento.data_vencimento = Convert.ToDateTime(txtdata_vencimento.Text);
                Cliente_Pagamento.data_pagamento = Convert.ToDateTime(txtdata_pagamento.Text);

                Cliente_Pagamento.id_cliente = Convert.ToInt32(Request[ddlCliente.UniqueID]);
                Cliente_Pagamento.id_academia = Convert.ToInt32(txt_academia.Text);

                int idCliente_Pagamento;
                if (int.TryParse(Request["id"], out idCliente_Pagamento))
                {
                    Cliente_Pagamento.id = idCliente_Pagamento;
                    new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().AlterarCliente_Pagamento(Cliente_Pagamento);
                }
                else
                {
                    new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().InserirCliente_Pagamento(Cliente_Pagamento);
                }
                Response.Redirect("MainCliente_Pagamento.aspx");
            }
        }

        protected void ddlCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            txt_academia.Text = (Session[Util.SESSION_ACADEMIA_ID]).ToString();

            //sugere a data de vencimento 
            txtdata_vencimento.Text = sugereVencimento(Convert.ToInt32(Request[ddlCliente.UniqueID])).ToString("dd/MM/yyyy");

            //criar campo txt_saldoAPagar que será o débito atual do cliente
            txt_saldoAPagar.Text = calculaSaldoAPagar().ToString();
        }

        #region sugere a nova data de vencimento
        protected DateTime sugereVencimento(int id)
        {
            //este método irá verificar na tabela do banco de dados qual o próximo vencimento...
            //será necessário buscar/selecionar qual a ultima data de vencimento cadastrada no banco. Depois disso, basta acrescentar um mes a mais e setar este valor no
            //txtdata_vencimento
            List<WsAcademiaInteligente.Cliente_Pagamento> pagamentosDoCliente = new List<WsAcademiaInteligente.Cliente_Pagamento>();
            pagamentosDoCliente = new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().ListarClientePagamentoPorCliente(id).ToList();

            WsAcademiaInteligente.Cliente cliente = new WsAcademiaInteligente.Cliente();
            cliente = new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().SelecionarCliente(id);

            DateTime maiorDataVencimento;
            DateTime dataMatricula = DateTime.MinValue;
            foreach (var item in cliente.ClienteAcademia)
            {
                if (item.id_academia == Convert.ToInt32(Session[Util.SESSION_ACADEMIA_ID]))
                {
                    dataMatricula = item.data_inclusao;
                }
            }
            if (cliente != null)
            {
                maiorDataVencimento = dataMatricula;
            }
            else
            {
                maiorDataVencimento = Convert.ToDateTime("01/01/2001");
            }

            if (pagamentosDoCliente != null)
            {
                //se retornar resultado, deverá se comportar como descrito acima
                foreach (var item in pagamentosDoCliente)
                {
                    if (item.data_vencimento > maiorDataVencimento)
                    {
                        maiorDataVencimento = item.data_vencimento;
                    }
                }
                //adiciono 1 mês a mais para que seja sugerido o próximo vencimento
                maiorDataVencimento = maiorDataVencimento.AddMonths(1);
            }
            else
            {
                //é o primeiro pagamento
                //maiorDataVencimento recebe data de cadastro do cliente + 1 mes
                maiorDataVencimento = dataMatricula.AddMonths(1);
            }

            return maiorDataVencimento;
        }
        #endregion

        protected Double calculaSaldoAPagar()
        {
            Double valor = 0;
            //WsAcademiaInteligente.Cliente cliente = new WsAcademiaInteligente.Cliente();
            //cliente = new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().SelecionarCliente(Convert.ToInt32(Request[ddlCliente.UniqueID]));

            List<WsAcademiaInteligente.Modalidade_Horario> modalidadeHorario = new List<WsAcademiaInteligente.Modalidade_Horario>();
            modalidadeHorario = new WsAcademiaInteligente.WsAcademiaInteligenteSoapClient().ListarModalidadeHorarioPorCliente(Convert.ToInt32(Request[ddlCliente.UniqueID])).ToList();
            foreach (var item in modalidadeHorario)
            {
                valor = valor + item.Valor;
            }
            return valor;
        }

        protected void txtValorPago_TextChanged(object sender, EventArgs e)
        {
            //implementar
            //fazer tratamento para não permitir pagar um valor menor que a mensalidade e caso o valor pago
            //seja maior deverá informar o valor do troco
            //com lbAviso.Text
            if (!string.IsNullOrEmpty(txtValorPago.Text) && !string.IsNullOrEmpty(txt_saldoAPagar.Text))
            {
                Double saldoAPagar = Convert.ToDouble(txt_saldoAPagar.Text);
                Double valorPago = Convert.ToDouble(txtValorPago.Text);

                if (valorPago < saldoAPagar)
                {
                    lbAviso.Text = "O valor informado para o pagamento não pode ser menor que o valor da mensalidade em questão.";
                    lbAviso.Visible = true;
                }
                /* else if (valorPago > saldoAPagar)
                 {
                     String troco = (valorPago - saldoAPagar).ToString();
                     lbAviso.Text = "Troco: " + troco;
                     lbAviso.Visible = true;
                 }
                 else
                 {
                     lbAviso.Text = "";
                     lbAviso.Visible = false;
                 }
                 */
            }
        }

        protected void txtdata_pagamento_TextChanged(object sender, EventArgs e)
        {
            txt_saldoAPagarComDesconto.Text = calculaSaldoAPagarComDesconto().ToString();
            txtValorComDesconto.Text = calculaSaldoAPagarDoDesconto().ToString();
        }

        protected Double calculaSaldoAPagarComDesconto()
        {
            Double valorDoDesconto = 0;
            Double valorComDesconto = 0;

            DateTime dataPagamento = DateTime.Today;
            DateTime dataVencimento = Convert.ToDateTime(txtdata_vencimento.Text);
            if (!string.IsNullOrEmpty(txtdata_pagamento.Text))
            {
                dataPagamento = Convert.ToDateTime(txtdata_pagamento.Text);
            }

            if ((dataVencimento.AddDays(-5)) >= dataPagamento)
            {
                //se o cliente está pagando com 5 dias ou mais de antecedencia
                //dou um desconto de 10%
                if (!string.IsNullOrEmpty(txt_saldoAPagar.Text))
                    valorDoDesconto = (Convert.ToDouble(txt_saldoAPagar.Text)) * 0.1;
                valorComDesconto = (Convert.ToDouble(txt_saldoAPagar.Text)) - valorDoDesconto;
            }
            else
            {
                //senão
                //o valor não sofrerá alterações
                if (!string.IsNullOrEmpty(txt_saldoAPagar.Text))
                    valorDoDesconto = 0;
                valorComDesconto = (Convert.ToDouble(txt_saldoAPagar.Text));
            }
            return valorDoDesconto;
        }

        protected Double calculaSaldoAPagarDoDesconto()
        {

            Double valorComDesconto = 0;
            Double valorDoDesconto = 0;

            DateTime dataPagamento = DateTime.Today;
            DateTime dataVencimento = Convert.ToDateTime(txtdata_vencimento.Text);
            if (!string.IsNullOrEmpty(txtdata_pagamento.Text))
            {
                dataPagamento = Convert.ToDateTime(txtdata_pagamento.Text);
            }

            if ((dataVencimento.AddDays(-5)) >= dataPagamento)
            {
                //se o cliente está pagando com 5 dias ou mais de antecedencia
                //dou um desconto de 10%
                if (!string.IsNullOrEmpty(txt_saldoAPagar.Text))
                    valorDoDesconto = (Convert.ToDouble(txt_saldoAPagar.Text)) * 0.1;
                valorComDesconto = (Convert.ToDouble(txt_saldoAPagar.Text)) - valorDoDesconto;
            }
            else
            {
                //senão
                //o valor não sofrerá alterações
                if (!string.IsNullOrEmpty(txt_saldoAPagar.Text))

                    valorComDesconto = (Convert.ToDouble(txt_saldoAPagar.Text));
            }
            return valorComDesconto;
        }

    }

}

